#ifndef LECTEURFONCTION_H
#define	LECTEURFONCTION_H

#include <string>
#include <stack>
#include <stdlib.h>

#include "Lecteur.h"

using namespace std;

class LecteurFonction : public Lecteur {
public:
    LecteurFonction(LecteurSymbole * ls);
    // Construit un lecteur de fonction pour analyser une déclaration de fonction
    //   et bâtir les représentations nécessaires à son execution.
    // ls référence un lecteur de symbole dont le symbole courant est
    //   le premier symbole de la déclaration.
    // Après l'analyse, le symbole courant sera le premier symbole qui suit la déclaration.

    Valeur* getValeur(stack<Valeur*> & p);
    // évalue la fonction avec les valeurs de paramètres effectifs contenus dans la Pile p
    // Si p ne contient pas nbParam valeurs, message d'erreur et fin du programme !

    inline int operator ==(string ch) {
        // renvoie vrai si nom==ch
        return nom == ch;
    }
    
    inline unsigned short getNbParam() {return this->nbParam;}
    // Accesseur de l'attribut nbParam
    
private:
    
    // le nom (l'identificateur) de la fonction
    string nom;
    
    // le nombre de paramètres de la fonction
    unsigned short nbParam;
    
    // implémentation de la grammaire d'une déclaration de fonction
    Noeud* declFonction();        // <decl_fonction>::= fonction <variable> ( <variable> { , <variable> } ) = <expression>
    Noeud* facteur();             //  <facteur>      ::= <ENTIER> | <REEL> | <CARACTERE> | <CHAINE> | <variable> | <opUnaire> <expBool> | ( <expBool> )
    
};

#endif	/* LECTEURFONCTION_H */

